/*
 * CommunicationDespacho.h
 *
 */

#ifndef COMMUNICATIONDESPACHO_H_
#define COMMUNICATIONDESPACHO_H_

#include <list>
#include "MiddlewareCommon.h"
#include "../IPC/MessageQueue.h"


namespace middleware {

class CommunicationDespacho
{
public:
	typedef enum{RETIRAR=0, NOTIFICAR_DESPACHO}DespachoRequestType;
	typedef enum{NOTIFICACION_CLIENTE=0, PRODUCTO,FIN_PRODUCTOS}DespachoReplyType;

	struct DespachoRequestStruct
	{
		DespachoRequestType requestType;
		OrdenCompraHeader ordenCompra;
		ProductoCantidad producto;
	};

	struct DespachoReplyStruct
	{
		DespachoReplyType replyType;
		OrdenCompraHeader ordenCompra;
		ProductoCantidad producto;
	};

	struct EntregaProductoStruct
	{
		OrdenCompraHeader ordenCompra;
		Producto producto;
	};

public:
	CommunicationDespacho();
	virtual ~CommunicationDespacho();

	void getDespachoRequest(DespachoRequestType &requestType,
							   OrdenCompraHeader &ordenCompra,
							   ProductoCantidad &producto);

	void notificarDespachoOCLista(OrdenCompraHeader &ordenCompra,ProductoCantidad &producto);

	void retirarProducto(OrdenCompraHeader &ordenCompra,TipoProducto &tipoProducto, Producto &producto);

	void notificarCliente(OrdenCompraHeader &ordenCompra,ProductoCantidad &producto);

	void esperarNotificacion(int clientId);

	void entregarProducto(OrdenCompraHeader &ordenCompra,Producto &producto);

	//Creacion
	static void create();

	static void destroy();

private:
	ipc::MessageQueue<DespachoRequestStruct> m_RequestQueue;
	ipc::MessageQueue<DespachoReplyStruct> m_ReplyQueue;
	ipc::MessageQueue<EntregaProductoStruct> m_EntregaQueue;

	static const std::string REQUEST_QUEUE_PATH;
	static const std::string REPLY_QUEUE_PATH;
	static const std::string ENTREGA_QUEUE_PATH;
	static const char REQUEST_QUEUE_KEY = 'a';
	static const char REPLY_QUEUE_KEY = 'b';
	static const char ENTREGA_QUEUE_KEY = 'c';
};

} /* namespace middleware */
#endif /* COMMUNICATIONDESPACHO_H_ */
